package java学习.第13章_泛型;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 12.父类有泛型，子类可以选择保留泛型也可以选择指定泛型类型:
 * ●子类不保留父类的泛型:按需实现
 * ➢没有类型擦除
 * ➢具体类型
 * ●子类保留父类的泛型:泛型子类
 * ➢全部保留
 * ➢部分保留
 * class Father<T1, T2> {
 * //子类不保留父类的泛型
 * // 1)没有类型擦除
 * class Son<A, B> extends Father{//等价于class Son extends Father<Object , 0bject>{
 * // 2)具体类型
 * class Son2<A, B> extends Father<Integer, String> {
 * //子类保留父类的泛型
 * // 1)全部保留
 * class Son3<T1, T2, A, B> extends Father<T1, T2> {
 * }
 * // 2)部分保留
 * class Son4<T2, A, B> extends Father<Integer, T2> {
 */
public class B_泛型的继承 {

    /**
     * 泛型在继承方面的体现
     * 类A是类B的父类，G<A> 和G <B>二者不具备子父类关系，二者是并列关系。
     * 补充:类A是类B的父类，A<G> 是 B<G>的父类
     */
    @Test
    public void 泛型在继承方面的体现() {
        Object obj = null;
        String str = null;
        obj = str;

        Object[] objs = null;
        String[] strs = null;
        objs = strs;

        List<Object> list = null;
        List<String> list1 = null;
//        list=list1;//报错  不具备子父类关系  不可以直接赋值
        list = Collections.singletonList(list1);//这中可以

        List<String> list2 = null;
        ArrayList<String> list3 = null;
        list2 = list3;//可以
    }


}

class Father<T1, T2> {
    T1 t1;
    T2 t2;
}

//等价于class Son extends Father<Object , Object>{
class Son<A, B> extends Father {
    A a;
    B b;
}

class Son2<A, B> extends Father<Integer, String> {
    A a;
    B b;
}

class Son3<T1, T2, A, B> extends Father<T1, T2> {
}

class Son4<T2, A, B> extends Father<Integer, T2> {

}